package com.dragon.modules.yuegou.service.order;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dragon.common.web.PageRequest;
import com.dragon.modules.yuegou.entity.order.OrderEntity;
import com.dragon.modules.yuegou.enums.order.OrderStatus;
import com.dragon.modules.yuegou.enums.order.OrderType;
import com.dragon.modules.yuegou.model.member.Member;
import com.dragon.modules.yuegou.model.order.Details;
import com.dragon.modules.yuegou.model.order.GoHomeOrderReplenish;
import com.dragon.modules.yuegou.model.order.Goods;
import com.dragon.modules.yuegou.model.order.Order;
import com.dragon.modules.yuegou.model.order.OrderPay;
import com.dragon.modules.yuegou.model.order.OrderRefund;
import com.dragon.modules.yuegou.model.order.OrderShippingInfo;
import com.dragon.modules.yuegou.model.system.Document;
import com.dragon.modules.yuegou.query.order.DetailsQuery;
import com.dragon.modules.yuegou.query.order.OrderDetailQuery;
import com.dragon.modules.yuegou.query.order.OrderMemberGradeQuery;
import com.dragon.modules.yuegou.query.order.OrderQuery;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单 服务接口
 *
 * @author pbuilder generated
 * @date 2019-04-03 13:57:50
 * @version 2.0
 */
public interface OrderService extends IService<OrderEntity> {

	/**
	 * 获取集团商圈订单记录分页列表
	 */
	IPage<Order> search(PageRequest page, OrderDetailQuery query);

	/**
	 * 导出集团商圈订单记录列表
	 */
	Document exportOrderDetail(OrderDetailQuery query);

	/**
	 * 获取订单详情<br>
	 * 
	 * <p>
	 * 所有提到“订单详情”的地方，订单数据结构与此处一致：<br>
	 * 如果是叶子订单: <br>
	 * 订单信息包括：订单基本信息、订单支付信息、订单物品列表、单品列表、订单优惠券列表<br>
	 * 如果不是叶子订单：<br>
	 * 则订单信息包括：订单基本信息、子订单列表[订单基本信息、订单支付信息、订单物品列表、单品列表、订单优惠券列表]<br>
	 * </p>
	 * 
	 * <p>
	 * 注意：订单的单品列表考虑到可能数据量过大的原因，不放在订单详情中，需要的话请使用<code>goodsService.listByOrder(orderNo)</code>查询
	 * </p>
	 * 
	 * @param orderNo 订单号
	 * @return 订单详情
	 */
	Order getOrder(String orderNo);

	/**
	 * 修改订单缓存
	 * @param order
	 */
	void modifyOrderCase(Order order);

	/**
	 * 分页查询订单详情
	 * 
	 * @param page  分页信息
	 * @param query 查询条件
	 * @return 订单详情分页列表
	 */
	IPage<Order> searchDetails(IPage<OrderEntity> page, OrderQuery query);
	
	/**
	 * 分页查询商户订单详情（已经付款的，按照订单号倒序）
	 * @param page  分页信息
     * @param merchantId 商户ID
	 * @param term 搜索关键字（订单号/商品名称）
     * @param status 是否已提货，为null表示查询所有已提货和未提货的
	 * @return 订单详情分页列表
	 */
	IPage<Order> findMerchantOrder(IPage<OrderEntity> page, String merchantId,  String term, OrderStatus status);

	/**
	 * 检验订单是否能支付
	 * 
	 * @param id
	 * @return
	 */
	boolean checkIsPay(String id);

	/**
	 * 下单<br>
	 * <p>
	 * 调用示例，商城下单：
	 * 
	 * <pre>
	 * Order request = new Order();
	 * request.setBuyer(MemberHolder.acquire());
	 * request.setType(OrderType.BUY);
	 * request.setBusdId(BUSD_ID);
	 * request.addItem(skuId1, num1).addItem(skuId2, num2);
	 * request.addCoupon(couponId1);
	 * orderService.placeOrder(request);
	 * </pre>
	 * 
	 * <p>
	 * 扫码支付（向商户）:
	 * 
	 * <pre>
	 * Order request = new Order();
	 * request.setBuyer(MemberHolder.acquire());
	 * request.setType(OrderType.SCAN_PAY);
	 * request.setBusdId(BUSD_ID);
	 * request.setAmount(amount)
	 * request.setMerchantId(merchantId);
	 * orderService.placeOrder(request);
	 * </pre>
	 * 
	 * <p>
	 * 自定义折扣价下单：
	 * 
	 * <pre>
	 * Order request = new Order();
	 * request.setBuyer(MemberHolder.acquire());
	 * request.setType(OrderType.BUY);
	 * request.setBusdId(BUSD_ID);
	 * request.addItem(skuId1, num1, discountPrice);
	 * orderService.placeOrder(request);
	 * </pre>
	 * 
	 * @param request 订单请求
	 * @return 订单详情
	 */
	Order placeOrder(Order request);
	
	/**
	 * 红豆商城邮寄商品单个下单
	 * @param request
	 * @return
	 */
	Order redBeanPlaceOrder(Order request);
	/**
	 * 下单
	 * @param request 订单请求
	 * @param ignoreStock 是否忽略库存（true则不去扣库存，调用放应该控制库存，false则由下单方法扣库存）
	 * @return 订单详情
	 */
	Order placeOrder(Order request, boolean ignoreStock);


	/**
	 * 预下单
	 * @param request 预下单
	 * @return 订单详情
	 */
	Order preOrder(Order request, boolean ignoreStock);
	
	/**
	 *  红豆商品邮寄预下单
	 * @param request 预下单
	 * @return 订单详情
	 */
	Order redBeanPreOrder(Order request, boolean ignoreStock);

	/**
	 * 发放商品下单
	 * @param request 预下单
	 * @return 订单详情
	 */
	Order issueOrder(Order request);

	/**
	 * 修改订单中订单物品的数量
	 * 
	 * @param orderNo 订单号
	 * @param orderItemId 订单物品ID
	 * @param num 修改后的数量
	 * @return
	 */
	Order modiftOrderItemNum(String orderNo,String orderItemId,int num);

	/**
	 * 修改扫码支付的订单支付金额
	 * @param orderNo
	 * @param payableAmount
	 * @return
	 */
	Order modiftPayableAmount(String orderNo,BigDecimal price,BigDecimal payableAmount);


	/**
	 * 积分+钱订单支付积分
	 * @param order
	 * @return
	 */
	Order modiftPayPoints(Order order);

	/**
	 * 订单支付
	 * 
	 * @param payinfo 支付信息
	 * @return 订单详情
	 */
	Order payOrder(OrderPay payinfo);


	/**
	 * 订单0元支付支付  没有事务
	 *
	 * @param payinfo 支付信息
	 * @return 订单详情
	 */
	Order payZeroOrder(OrderPay payinfo);

	/**
	 * 取消超时订单（系统取消）
	 * 
	 * @param orderNo 订单号
	 * @return true表示成功取消，false表示取消失败（不满足条件，或订单不存在）
	 */
	boolean cancelTimeoutOrder(String orderNo);

	/**
	 * 会员取消订单
	 * 
	 * @param orderNo 订单号
	 * @param member  当前会员
	 * @return true表示成功取消，false表示取消失败（不满足条件，或订单不存在）
	 */
	boolean cancelOrderByMember(String orderNo, Member member);

	/**
	 * 订单扫码核销
	 * 
	 * @param merchantId
	 * @param orderNo
	 * @return
	 */
	boolean orderVerify(String merchantId, String orderNo);

	/**
	 * 查询积分兑换订单
	 * 
	 * @param busdId   商圈ID
	 * @param memberId 会员ID
	 * @param pageInfo 分页信息
	 * @return 订单详情分页列表
	 */
	IPage<Order> findExchangeGoodsOrders(String busdId, String memberId, PageRequest pageInfo);

	/**
	 * 统计商户今天的收入
	 * @param merchantId
	 * @return
	 */
	BigDecimal totalTodayIncome(String merchantId);


	/**
	 * 统计商户今天的订单数
	 * @param merchantId
	 * @return
	 */
	Integer totalodayOrderNum(String merchantId);

	/**
	 * 统计商户今天的核销订单数
	 * @param merchantId
	 * @return
	 */
	Integer totalodayAfterNum(String merchantId);
	
	/**
	 * 我的未支付订单
	 * */
	IPage<Order> mySearchDetails(PageRequest page,String id, String busdId, OrderStatus status);

	/**
	 * 我的未支付订单
	 * */
	IPage<Order> mySearchDetails(PageRequest page,String id, String busdId, OrderStatus status,Integer orderType);


	/**
	 * 订单退款<br>
	 * 对订单余下的支付金额进行退款
	 * 
	 * @param orderNo 订单号
	 * @return 退款信息
	 */
	OrderRefund refundByOrder(String orderNo);

	/**
	 * 单品退款<br>
	 * 退款订单的某个单品
	 * @param goodsId 单品ID
	 * @return 退款信息
	 */
	OrderRefund refundByGoods(String goodsId,String refundReason);

	/**
	 * 验证是否能退款
	 * @param order
	 * @param refundAmount
	 */
	void checkRefundByOrder(Order order,BigDecimal refundAmount);

	/**
	 * 验证是否能退款
	 * @param goods
	 * @param refundAmount
	 */
	void checkRefundByGoods(Goods goods, BigDecimal refundAmount);

	/**
	 * 停车订单抵扣全部直接回调
	 * @param order
	 * @return
	 */
	Order orderNotify(Order order);

	/**
	 * 获取订单的详情
	 *
	 * @param orderNo
	 * @return
	 */
	Order getOrderDetail(String orderNo);

	IPage<Details> searchDetail(PageRequest page, DetailsQuery query);

	/**
	 * 查询订单详情导出列表
	 * */
	Document exportDetail(DetailsQuery query);

	/**
	 * 清除缓存
	 */
	void clearCache(String orderId);

	/**
	 * 创建空订单
	 * @param skuId
	 * @param memberId
	 * @param busdId
	 * @param ignoreStock
	 * @return
	 */
	Order createNullOrder(String skuId, String memberId, String busdId, OrderType type, boolean ignoreStock, Integer num);

	/**
	 * 设置订单是否能悦卡支付
	 * @param order
	 * @return
	 */
	Order setYueCard(Order order);

	/**
	 * 悦卡支付 购买的商品 自动核销
	 * @param countTime
	 */
	void yueCardOrderVerify(String countTime);

	/**
	 * 商户派送订单查询
	 * @param page  分页信息
	 * @param term 搜索关键字（商品名称）
     * @param status 订单类型 0-全部、1-待接单、2-待派送、3-待确认、4-已成功
	 * @param merchantId 商户Id
	 * */
	IPage<Order> deliveryList(PageRequest page,String term, String status, String merchantId);

	/**
	 * 会员派送订单查询
	 * @param page  分页信息
	 * @param busdId 商圈Id
     * @param status 订单类型 0-全部、1-待支付、2-待接单、3-配送中、4-待收货
     * @return 订单分页信息
	 * */
	IPage<Order> deliveryListc(PageRequest page , String memberId, String busdId , String status);

	/**
	 * 会员订单详情
	 * @param orderNo 订单号
	 * @return 订单详情信息
	 * */
	Order deliveryDetailsc(String orderNo);


	/**#######达达订单配送状态流转########***/

	/**
	 * 修改订单收货地址
	 * @param orderNo
	 * @param addressId
	 * @return
	 */
	Order modifieShippingAddress(String orderNo, String addressId);


	/**
	 * 修改买家留言
	 * @param orderNo
	 * @param buyerMessage
	 * @return
	 */
	Order modifieOrderMessage(String orderNo, String buyerMessage);

	/**
	 * 获取运费账单
	 * */
	List<Order> freightBill(String merchantId, LocalDateTime startTime, LocalDateTime endTime);

	/**
	 * 获取商家未处理配送订单数量
	 * */
	Integer unprocessed(String merchantId);

	/**
	 * 获取到家订单物流信息
	 */
	GoHomeOrderReplenish replenishGoHomeOrder(Order order);

	/**
	 * 商户派送订单详情
	 * @param orderNo 订单号
	 * @return 订单详情信息
	 * */
	Order deliveryDetails(String orderNo);

	/**
	 * 悦商圈小程序/APP获取到家订单配送信息
	 */
	OrderShippingInfo getOrderShippingInfo(String orderNo);

	/**
	 * 查询待支付订单列表
	 * */
	IPage<Order> toBePaidlist(PageRequest page, String id, String busdId);

	/**
	 * 待支付订单详情
	 * */
	Order toBePaiDetails(String orderNo);

	/**
	 * 拒绝接单
	 * @param orderNo 订单号
	 * */
	Boolean noOrders(String orderNo,Boolean isSendSms);

	/**
	 *
	 * 自动拒绝接单
	 */
	List<String> refusalTask();


	/**
	 * 立即接单
	 * @param orderNo 订单号
	 * */
	void orders(String orderNo);

	/**
	 * 立即派送
	 * @param orderNo 订单号
	 * */
	void immediately(String orderNo);

	/**
	 * 达达回调 修改订单状态
	 * */
	void modifyOrderStatus(String orderNo,OrderStatus status);

	/**
	 * 配送完成
	 * */
	void accomplish(String orderNo);

	/**
	 * 确认收货
	 * @param orderNo 订单号
	 * */
	void confirmReceipt(String orderNo);

	/**
	 * 到家订单配送中商品发货时间超出48小时直接完成
	 */
	void completeGoHomeOrder();

	/***
	 * 补充处理到家订单 ，补充信息
	 * @param orderNo
	 */
	void replenishGoHomePickOrder(String orderNo);

	/**
	 * 预下单 修改收货地址
	 * @param order
	 * @param addressId
	 * @return
	 */
	Order updateAddress(Order order, String addressId);

	/**
	 * 获取到家埋点订单号
	 * @param merchantId
	 * @return
	 */
	String getToHomePoint(String merchantId);

	/**
	 * 清除到家埋点
	 * @param merchantId
	 */
	void cleanToHomePoint(String merchantId);
	/**
	 * 修改订单状态
	 * @param order
	 */
    void updateStatus(Order order);

	/**
	 * 获取指定商圈下指定用户id的累计消费金额
	 * @param query
	 * @return
	 */
	BigDecimal getOrderOnlineMoneyByMemberId(OrderMemberGradeQuery query);

	/**
	 * 获取指定商圈下指定用户id的累计消费次数
	 * @param query
	 * @return
	 */
	BigDecimal getOrderConsumeTimesByMemberId(OrderMemberGradeQuery query);

	/**
	 * 领取免费商品/卷生成订单
	 * @param order
	 * @return
	 */
	Order placeOrderFree(Order order);

	/**
	 * 订单数量
	 * @param busdId
	 * @param buyerId
	 * @param orderStatus
	 * @param type 0 到店订单 1到家订单
	 * @return
	 */
	Integer orderNum(String busdId,String buyerId,OrderStatus orderStatus,Integer type);
}

